#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char mensaje[150];					/* Mensaje para imprimir por pantalla */
	int childpid;

	if ( argc != 4 )					/* Nombre de ejecutable + 3 variables */
	{
		sprintf(mensaje, "%s Uso: <cantidad clientes> <cantidad cajas> <cantidad despachantes>\n", argv[0]);
		write(fileno(stdout), mensaje, strlen(mensaje));

		exit(0);
	}

								/* Hago algunas manganetas con el PATH para no depender de las rutas */
	char *pathenv;						/* de los archivos para poder ejecutarlos */
	int pathsize = sizeof(pathenv) + 1500;
	char newpathenv[pathsize];
	pathenv = (char*)getenv("PATH");			/* Obtengo el valor de la variable de enviroment PATH */
	strcpy(newpathenv, pathenv);
	strcat(newpathenv, ":.");				/* Agrego el directorio donde estoy parado, se puede poner otro... */
	setenv("PATH", newpathenv, 1);

	int nroprogramas = 3;					/* Numero de programas que voy a ejecutar (comienza en 0) */
	int cantprocesos[nroprogramas];				/* Cantidad de procesos que levanto por programa */
	char *nombreprograma[3];				/* Nombre de los binarios que ejecutare */

								/* Se ingresan las cantidades por parametro */
	cantprocesos[0] = atoi(argv[1]);			/* Cantidad de Procesos Cliente */
	cantprocesos[1] = atoi(argv[2]);			/* Cantidad de Procesos Caja */
	cantprocesos[2] = atoi(argv[3]);			/* Cantidad de Procesos Despachante */
	cantprocesos[3] = cantprocesos[1];			/* Cantidad de Procesos Caja Cobradora */

								/* Defino los nombres de los binarios que voy a ejecutar */
	nombreprograma[0] = "cliente";
	nombreprograma[1] = "caja";
	nombreprograma[2] = "despachante";
	nombreprograma[3] = "cobrador";

	int programa;
	int proceso;
	int parametro = 0;

	for ( programa=0; programa <= nroprogramas; programa++ )
	{
		for ( proceso=0; proceso < cantprocesos[programa]; proceso++ )
		{
			if ((childpid = fork()) < 0)
			{
				perror("Error en el fork");
				exit(1);
			}
			else if (childpid == 0)
			{
				sprintf(mensaje, "Iniciando %s Nro. %d\n", nombreprograma[programa], proceso + 1);
				write(fileno(stdout), mensaje, strlen(mensaje));

				if (execlp(nombreprograma[programa], nombreprograma[programa], parametro, (char *)0) != 0){
					perror("Error en execlp");
					exit(1);
				}
			}
		}
	}

 return 0;
}
